import http from './interface'

/**
 * 将业务所有接口统一起来便于维护
 * 如果项目很大可以将 url 独立成文件，接口分成不同的模块
 *
 */
let allApis = {};

//自动扫描子模块api并导入
// #ifndef VUE3
const apisContext = require.context('@/apis/', false, /\.js$/);
apisContext.keys().forEach(api => {
	const apiModule = apisContext(api)
	// 兼容 import export 和 require module.export两种规范
	Object.assign(allApis, (apiModule.default || apiModule));
});
// #endif

// #ifdef VUE3
const apisContext = import.meta.glob("/apis/**/**.js", {eager: true});
Object.keys(apisContext).forEach(path => {
	const apiModule = apisContext[path]
	// 兼容 import export 和 require module.export两种规范
	Object.assign(allApis, (apiModule.default || apiModule));
});
// #endif

//包裹请求方法的容器
const apis = {
	config: {
		proxyPrefix: "/dev-api",				// H5使用代理请求，不写默认使用前缀’/dev-api‘进行请求，之后在mainifest.json中配置’/dev-api‘代理跳转（vue2 webpack），vite.config.js中配置’/dev-api‘代理跳转（vue3 vite）
		serverUrl: 'http://localhost:8080',		// 小程序、APP则直接使用服务器路径请求，不写默认使用 http://localhost:8080 路径请求
		userStoreModule: 'user',				// store中存用户token相关信息的Store模块名
	},
	setConfig(option) {
		// 使用 Object.assign 或者解构赋值来合并配置
		this.config = { ...this.config, ...option };
	},
	getCityLocation(key, city) {
		// #ifdef MP-WEIXIN
		return new Promise((resolve, reject) => {
			uni.request({
				url: `https://apis.map.qq.com/ws/geocoder/v1`,
				method: 'GET',
				data: {
					key: key,
					address: city
				},
				complete: (response) => {
					let statusCode = response.statusCode;
					if (process.env.NODE_ENV === 'development') {
						if (statusCode === 200) {
							// console.log("【" + _config.requestId + "】 结果：" + JSON.stringify(response.data))
							console.log("获取城市位置信息：" + response.data)
						}
					}
					let loc = response.data.result.location
					resolve({
						latitude: loc.lat,
						longitude: loc.lng
					});
				},
				fail: (err) => {reject(err);}
			});
		});
		// #endif
		// #ifndef MP-WEIXIN
		return new Promise((resolve, reject) => {
			uni.request({
				url: `https://restapi.amap.com/v3/geocode/geo`,
				method: 'GET',
				data: {
					key: key,
					address: city
				},
				complete: (response) => {
					let statusCode = response.statusCode;
					if (process.env.NODE_ENV === 'development') {
						if (statusCode === 200) {
							// console.log("【" + _config.requestId + "】 结果：" + JSON.stringify(response.data))
							console.log("获取城市位置信息：" + response.data)
						}
					}
					let loc = response.data.geocodes[0].location.split(',')
					resolve({
						latitude: loc[1],
						longitude: loc[0]
					});
				},
				fail: (err) => {reject(err);}
			});
		});
		// #endif
	},
	getLocationCity: (key, latitude, longitude) => {
		// #ifdef MP-WEIXIN
		return new Promise((resolve, reject) => {
			uni.request({
				url: `https://apis.map.qq.com/ws/geocoder/v1`,
				method: 'GET',
				data: {
					key: key,
					location: latitude+','+longitude
				},
				complete: (response) => {
					let statusCode = response.statusCode;
					if (process.env.NODE_ENV === 'development') {
						if (statusCode === 200) {
							// console.log("【" + _config.requestId + "】 结果：" + JSON.stringify(response.data))
							console.log("获取城市位置信息：" + response.data)
						}
					}
					resolve(response.data.result.address_component);
				},
				fail: (err) => {reject(err);}
			});
		});
		// #endif
	},
	test: async (options) => {
		return await new Promise(resolve => setTimeout(() => resolve({code: 200, msg:"测试接口", data: {}}), 200))
	}
};

// 请求格式、参数的统一
for(let key in allApis){
	let api = allApis[key]   // method url
	apis[key] = function(options){
		// 默认参数
		options = Object.assign({
			params: {},    			// 请求参数
			jointUrl: "",			// restful请求格式中添加/{id}
			needToken: true,			// 是否需要token，true/false
			type: "form"
		}, options);

		// H5要用代理请求
		// #ifdef H5
		let baseUrl = this.config.proxyPrefix
		// #endif
		// #ifndef H5
		// 小程序、APP，直接用路径
		let baseUrl = this.config.serverUrl
		// #endif

		return http.request({
			baseUrl: baseUrl,
			url: api.url + options.jointUrl,
			method: api.method,
			data: options.params,
			type: options.type
		}, options.needToken, uni.$xl.store[this.config.userStoreModule])
	}
}

export default apis